﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using OpenSource.UPnP;
using System.Xml;
using System.Windows.Markup;
using System.IO;
using System.Reflection;
using System.Threading;
using System.Windows.Threading;
using System.Runtime.CompilerServices;
using System.Collections;


namespace DispositifAffichage
{
    public class GenerateInterface2
    {

        private string description;
        Window x;
        private string nameupnp;
        ArrayList _zonesException1 = new ArrayList();

        DispositifAffichage.ClientDispositifAffichage2 client2;
        MainWindow mainwindow;

        public GenerateInterface2(string fich, string name, MainWindow mainw)
        {
            this.description = fich;
            this.nameupnp = name;
            client2 = new DispositifAffichage.ClientDispositifAffichage2(this);
            client2.startUPnP();
            mainwindow = mainw;
        }

        public String Description
        {
            get
            {
                return description;
            }
        }
                
        public String Nameupnp
        {
            get
            {
                return nameupnp;
            }
        }

        public Window X
        {
            get
            {
                return x;
            }
        }

        public void chargement_UI()
        {
                    
            int n = 0;

            while (n != 1)
            {
                try
                {

                    XmlReader reader2 = XmlReader.Create(new StringReader(description));
                    x = new Window();

                    x = (Window)XamlReader.Load(reader2);
                    Console.WriteLine("le load est faittttttttttttt");


                    //x.IsEnabled = true;
                   /* double t1 = x.Width;
                    double t2 = x.Height;

                   
                    object myWindow=x;

                    int Height;

                    Height = Screen.FromControl(myWindow).Bounds.Height;
                   


                    Console.WriteLine("t1 est : "+t1.ToString());
                    Console.WriteLine("t2 est : " + t2.ToString());
                    */
                    n++;
                    Console.WriteLine(n);

                }

                catch (XamlParseException ex)
                {
                    Console.WriteLine(" XamlParseException:");
                    Console.WriteLine("Il y a une erreur, plus d'informations ci-dessous :");
                    Console.WriteLine();
                    Console.WriteLine("\n Type de l'exception : " + ex.GetType());
                    Console.WriteLine();
                    Console.WriteLine("Message d'erreur : " + ex.Message);
                    Console.WriteLine();

                    string s = ex.Message;
                    //s ='Échec de la création d'un 'Click' à partir du texte 'button1_Click'.
                    //' numéro de ligne '1' et position de ligne '365'.(par exemple)

                    int first = s.IndexOf("'") + 1;

                    int last = s.IndexOf(".");

                    //s contient la chaîne qui donne information sur l'événement et le nom de la méthode

                    s = s.Substring(first, last - first);

                    //s=Échec de la création d'un 'Click' à partir du texte 'button1_Click'
                    Console.WriteLine("la valeur de s est: \n " + s);

                    //splitted1 est un arraylist à 3 cases qui contient le nom de l'événement/ le nom de la méthode

                    string[] splitted = s.Split('\'');

                    string[] splitted1 = new string[3];

                    Console.WriteLine("détection de l'event");
                    splitted1[0] = splitted[2];
                    Console.WriteLine("%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%");
                    Console.WriteLine(splitted[2]);
                    //splitted1[0]=Click== event

                    Console.WriteLine("détection du nom de la methode");

                    splitted1[1] = splitted[4];
                    Console.WriteLine(splitted[4]);

                    //splitted1[0]=button1_Click== nom de la méthode
                    Console.WriteLine("%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%");

                    // _zones3 contient pr le moment(Click, button1_Click )=(event, nom de la méthode)


                    //Maintenant je veux récupérer le nom du composant et son type
                    string[] splitted2 = description.Split('<');

                    for (int i = 1; i < splitted2.Length; i++)
                    {
                        //splitted2 contient le fichier de description
                        splitted2[i] = "<" + splitted2[i];

                        Console.WriteLine(splitted2[i]);
                    }



                    Console.WriteLine("*****************************************************************");

                    for (int i = 1; i < splitted2.Length; i++)
                    {


                        if (splitted2[i].Contains(splitted[2]) && splitted2[i].Contains(splitted[4]))
                        {
                            Console.WriteLine(splitted2[i]);
                            Console.WriteLine("j'ai trouvé une valeur");

                            //nom contient le nom de la l'objet associé à l'événement et la méthode à appeler


                            int t1 = splitted2[i].IndexOf("Name=\"");
                            int t2 = splitted2[i].IndexOf("\"");
                            string nom = splitted2[i].Substring(splitted2[i].IndexOf("Name=\""), splitted2[i].IndexOf("\""));

                            Console.WriteLine("le nom est :  " + nom);


                            int first3 = nom.IndexOf("\"") + 1;
                            Console.WriteLine("le first est :  " + first3);

                            int last3 = nom.LastIndexOf("\"");
                            Console.WriteLine("le last est :  " + last3);
                            //maintenant splitted1 contient le nom de l'événement/ le nom de la méthode/ le nom de l'objet

                            //Console.WriteLine("détection du nom de composantttttttttttttttttttt");
                            string name = nom.Substring(first3, last3 - first3);
                            Console.WriteLine("le name est :" + name);

                            //maintenant splitted1 contient le nom de l'événement/ le nom de la méthode/ le nom de l'objet/ le type de composant(Button, checkbox...)

                            //Console.WriteLine("###########################################################");

                            //Console.WriteLine("détection du type de composantttttttttttttttttttt");

                            string Typecomposant = splitted2[i].Substring(splitted2[i].IndexOf("<") + 1, splitted2[i].IndexOf(" ") - 1);

                            //Console.WriteLine(Typecomposant);
                            //Typecomposant = Typecomposant.Trim();
                            Console.WriteLine("taile de zone exception:" + _zonesException1.Count);

                            _zonesException1.Add(Typecomposant);
                            _zonesException1.Add(name);
                            _zonesException1.Add(splitted[2]);
                            _zonesException1.Add(splitted[4]);
                            Console.WriteLine("taile de zone exception:" + _zonesException1.Count);

                            //Console.WriteLine("###########################################################");


                            string b = splitted1[0] + "=\"" + splitted1[1] + "\"";
                            //exemple de valeur de b= Click="button1_Click"

                            //Console.WriteLine("b est de valeuuurrrrrrrrr : " +b);

                            description = description.Replace(b, "");
                            //Console.WriteLine("la deuxième chaine est : \n" + chaine);

                        }

                    }

                    for (int k = 0; k < _zonesException1.Count; k++)
                    {

                        Console.WriteLine(_zonesException1[k]);

                    }

                    Console.WriteLine("*****************************************************************");


                }
                catch (Exception ex)
                {
                    Console.WriteLine("Exception:");
                    Console.WriteLine("Il y a une erreur, plus d'informations ci-dessous :");

                    Console.WriteLine();
                    Console.WriteLine("Message d'erreur : " + ex.Message);

                    Console.WriteLine();
                    Console.WriteLine("Type de l'exception : " + ex.GetType());
                }
            }

            Grid grid1 = (Grid)x.FindName("Grid");
            int q = 0;
            EventInfo[] list;


            Console.WriteLine("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&");

            int tt = _zonesException1.Count;

            Console.WriteLine("tt esttttttttttttttttttttttttttttttt  " + tt);
            for (int c = 1; c < _zonesException1.Count; c++)
            {
                string nomComposant = (string)_zonesException1[c];

                Console.WriteLine("le nom du composant estttttttttttt  " + nomComposant);


                var myT = x.FindName(nomComposant);

                if (myT != null)
                {


                    Console.WriteLine("le composant " + nomComposant + " existe  <<<<<<<<<<<<<<<<<<<<<<<<<<<<");


                    list = myT.GetType().GetEvents();

                    Console.WriteLine("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&");

                    for (int f = 0; f < list.Length; f++)
                    {
                        string nomevent = list[f].Name;
                        string nomeventtab = (string)_zonesException1[c + 1];

                        if (nomevent == nomeventtab)
                        {
                            Console.WriteLine(nomevent);
                            Console.WriteLine("GOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO");
                            //Ajout de l'évènement au composant (par exemple event= Click)
                            var evt = myT.GetType().GetEvent(nomevent);
                            RoutedEventHandler myCode = delegate { methodeEvent(myT, null); };
                            evt.AddEventHandler(myT, myCode);
                            Console.WriteLine("Ajout de l'évènement " + nomeventtab + " au composant " + nomComposant);

                        }

                    }

                    Console.WriteLine("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&");

                }


                else { Console.WriteLine("le composant " + nomComposant + " n'existe pas  >>>>>>>>>>>>>>>>>>>"); }

                c = c + 3;
            }


            Console.WriteLine("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&");
           
            x.ShowDialog();

        }


        private void methodeEvent(object sender, EventArgs e)
        {
            Console.WriteLine("Appel de la méthode 'methodeEvent' ");
            
            string nom = (sender as Control).Name;

            Console.WriteLine("le senderrrrrrrrrrrrrrrrrrrrr  esttt  " + nom);


            for (int h = 1; h < _zonesException1.Count; h = h + 4)
            {
                string composant = _zonesException1[h].ToString();

                //name==nom du button qui a déclencher l'événement

                string name = _zonesException1[h].ToString();

                if (nom == name)
                {

                    Console.WriteLine("!!!!!!!!!!!!!!!!!!!Test!!!!!!!!!!!!!!!!!!!!");
                    Console.WriteLine("j'ai trouvé le sender " + name);
                    Console.WriteLine("!!!!!!!!!!!!!!!!!!!Fin du Test!!!!!!!!!!!!!!!!!!!!");

                    string meth = _zonesException1[h + 2].ToString();

                    invockMeth(meth, name);

                }
                // h = h + 3;

            }

        }



        public void invockMeth(string meth, string name)
        {
            Console.WriteLine("methode invoquee " + meth + " par " + name);
            client2.Search(meth);
        }

        public void changeresultat(string component, string propriete, string valeur)
        {

            Console.WriteLine("invocation de la méthode 'changeresultat' ");

            Console.WriteLine("Invoker la méthode 'recupereResultat'");

            Console.WriteLine(component);
            Console.WriteLine(propriete);
            Console.WriteLine(valeur);

            //mainwindow.recupereResultat(component, propriete, valeur);
           mainwindow.recupereResultat1(component, propriete, valeur, this);
        }





    }
}
